package main

import (
	"fmt"
)

/*
一、构体成员是由一系列的成员变量构成，这些成员变量也被称为“字段”。字段有以下特性：
1、字段拥有自己的类型和值。
2、字段名必须唯一。
3、字段的类型也可以是结构体，甚至是字段所在结构体的类型。
4、结构体的存储空间是连续的，字段按照声明时的顺序存放（注意字段之间有字节对齐要求）
二、Go语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性，
如，在校学生有姓名、年龄、身高、成绩等属性，学了结构体后，我们就不需要再定义多个变量了，将它们都放到结构体中即可
三、在Go语言中，结构体承担着面向对象语言中类的作用，Go语言中，结构体本身仅用来定义属性，还可以通过接收器函数来定义方法，使用内嵌结构体来定义继承。
这样使用结构体相关操作Go语言就可以实现OOP面向对象编程了，Go语言不仅认为结构体能拥有方法，且每种自定义类型也可以拥有自己的方法
*/

/*
一、定义结构体
type 名称 struct{
	字段1 类型
	字段2 类型
	字段3 类型
}
*/

//1、定义一个结构体类型包含个人基本信息(之前可以采用二位数组)

type Person struct {
	name    string
	age     int
	address string
	height  int
}

func main() {
	/*
		二、初始化普通结构体类型
	*/
	//方式一
	p1 := Person{"jiang", 18, "深圳", 180}
	fmt.Println(p1)
	//方式二
	p2 := Person{
		name:    "xiaohong",
		height:  178,
		address: "海南",
	}
	fmt.Println(p2)
	//方式三(结构体名称.字段)
	var p5 Person
	//赋值
	p5.age = 18
	p5.name = "su"
	fmt.Println(p5)
	//取值
	fmt.Println(p5.height)
	// 上面两种都是初始化一个结构体，第一种为简写每个字段必须按顺序写满，第二种为指定字段初始化，可以不按顺序，可以只初始化某些在字段，没有初始化的为字段类型的默认值

	//方式四 new()
	p6 := new(Person)
	p6.age = 18
	p6.name = "xiaohong"
	fmt.Println(*p6)
	/*
		三、初始化结构体类型的切片
	*/
	var p3 []Person
	p3 = append(p3, p1)
	p3 = append(p3, Person{
		name: "xiaohong",
	})
	fmt.Printf("%v\n", p3)

	p4 := []Person{
		{"jiang", 18, "深圳", 180},
		{age: 19, name: "li"},
	}
	fmt.Printf("%v\n", p4)
}
